package cn.liutao.upload.service;

import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.net.multipart.UploadFile;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import cn.hutool.extra.qrcode.QrConfig;
import cn.liutao.common.enums.CommonEnum;
import cn.liutao.common.exception.OrderException;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import lombok.extern.slf4j.Slf4j;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

/**
 * @author: liutao
 * @description: 文件上传service
 * @date: 2023/11/23 21:47
 */
@Slf4j
public class UploadService {
    private List<String> extensions= Arrays.asList("png","jpeg","jpg");//可上传文件类型
    private String directory = CommonEnum.FILE_UPLOAD_DIRECTORY.getValue();//文件上传地址

    private UploadService(){}

    /**
     * 生成二维码
     * @param uploadFile logo图片
     * @param tableId   餐桌编号
     * @param content   二维码内容
     * @return
     */
    public File generateQrCode(UploadFile uploadFile, String tableId, String content) {
            File logoFile=null;
            String type=".jpeg";
            File qrCodeFile;
            try {
                if (uploadFile!=null){
                    //判断是否为图片文件
                    logoFile = File.createTempFile("qrCode",concat(type));
                    uploadFile.write(logoFile);
                    type = FileUtil.getType(logoFile);
                    if (!extensions.contains(type)){
                        throw new OrderException("请上传图片资源");
                    }
                }
                //构造二维码参数
                QrConfig qrConfig = new QrConfig();
                if (logoFile!=null) qrConfig.setImg(logoFile);
                qrConfig.setMargin(1);
                qrConfig.setErrorCorrection(ErrorCorrectionLevel.Q);
                qrConfig.setRatio(3);
                content = content+"?tableId="+tableId;
                BufferedImage qrCodeImg = QrCodeUtil.generate(content, qrConfig);
                //构造返回文件
                qrCodeFile = File.createTempFile("qrCode",concat(type));
                ImgUtil.write(qrCodeImg,qrCodeFile);
            } catch (IOException e) {
                log.error("生成二维码文件失败：{}",e.getMessage());
                throw new OrderException("生成二维码文件失败");
            }
        return qrCodeFile;
    }

    /**
     * 使用静态内部类实现单例
     */
    private static class InstanceHolder{
        private static final UploadService instance = new UploadService();
    }

    public static UploadService getInstance(){
        return InstanceHolder.instance;
    }


    /**
     * 文件上传接口
     * @param file 要上传的文件
     * @param path 上传地址
     * @return url地址
     */
    public String upload(File file,String path){
        String url;
        try {

            String type = FileUtil.getType(file);
            if (!extensions.contains(type)){
                throw new OrderException("请上传图片资源");
            }
            //构造文件地址信息
            String fileMd5 = getFileMd5(file);
            String fileName = fileMd5+"."+type;
            url = concat(path,fileName);
            String absolutePath = concat(directory,url);
            File uploadFile = new File(absolutePath);
            //判断文件是否存在
            if (FileUtil.exist(uploadFile)) {
                //文件存在，无需重复上传
                return url;
            }
            //创建文件
            FileUtil.copy(file,uploadFile,true);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return url;
    }

    /**
     * 获取文件的md5值
     * @param file 文件
     * @return md5值
     */
    private String getFileMd5(File file){
        String fileMd5 = DigestUtil.md5Hex(file);
        return fileMd5;
    }


    public String concat(String resourcePath,String... paths){
        StringBuffer url = new StringBuffer();
        // 判断是否以斜杠结尾
        if (StrUtil.isNotBlank(resourcePath)) {
            if (resourcePath.endsWith("/")) {
                url.append(resourcePath, 0, resourcePath.length() - 1);
            }else {
                url.append(resourcePath);
            }
        }
        for (String path : paths) {
            // 判断是否以斜杠开头
            if (!path.startsWith("/")) {
                url.append("/");
            }
            // 判断是否以斜杠结尾
            if (path.endsWith("/")) {
                url.append(path, 0, path.length() - 1);
            } else {
                url.append(path);
            }
        }
        return url.toString();
    }

    public String getExtension(String fileName){
        return fileName.substring(fileName.lastIndexOf("."),fileName.length());
    }
}
